Dette spørgsmåls svar er en indsats fra samfundet. Rediger eksisterende svar for at forbedre dette indlæg. Det accepterer i øjeblikket ikke nye svar eller interaktioner. Jeg skrev den forkerte ting i en meddelelse. Hvordan kan jeg ændre beskeden? Forpligtelsen er ikke blevet skubbet endnu.
2020-12-07 22:11:37
Ændring af den seneste forpligtelsesmeddelelse git commit --ændre åbner din redaktør, så du kan ændre kommandobeskeden for den seneste begivenhed. Derudover kan du indstille kommitteringsmeddelelsen direkte i kommandolinjen med: git commit --amend -m "New commit message" … Dette kan dog gøre kommandobeskeder med flere linjer eller små rettelser mere besværlige at indtaste. Sørg for, at du ikke har foretaget nogen ændringer i arbejdskopien, inden du gør dette, ellers bliver de også engagerede. (Ikke-trinvise ændringer bliver ikke begået.) Ændring af meddelelsen om en forpligtelse, som du allerede har skubbet til din eksterne filial Hvis du allerede har skubbet din forpligtelse op til din eksterne filial, skal du - efter at have ændret din forpligtelse lokalt (som beskrevet ovenfor) - også nødt til at tvinge skubbe forpligtelsen med: git push--force # Eller git skub -f Advarsel: tvangsskubning overskriver den eksterne gren med tilstanden for din lokale. Hvis der er forpligtelser på den eksterne gren, som du ikke har i din lokale filial, mister du disse forpligtelser. Advarsel: vær forsigtig med at ændre forpligtelser, som du allerede har delt med andre mennesker. Ændring forpligter sig i det væsentlige til at omskrive dem til at have forskellige SHA-id'er, hvilket udgør et problem, hvis andre mennesker har kopier af den gamle forpligtelse, som du har omskrevet. Enhver, der har en kopi af den gamle forpligtelse, skal synkronisere deres arbejde med din nyomskrevne forpligtelse, hvilket nogle gange kan være vanskeligt, så sørg for at koordinere med andre, når du forsøger at omskrive delt forpligtelseshistorik, eller bare undgå at omskrive delte forpligtelser helt. Udfør en interaktiv rebase En anden mulighed er at bruge interaktiv rebase. Dette giver dig mulighed for at redigere enhver besked, du vil opdatere, selvom det ikke er den seneste besked. Følg disse trin for at lave en Git squash: // n er antallet af forpligtelser op til den sidste forpligtelse, du vil kunne redigere git rebase -i HEAD ~ n Når du klemmer dine forpligtelser - vælg e / r til redigering af beskeden: Vigtig note om interaktiv rebase Når du bruger git rebase -i HEAD ~ n, kan der være mere end n forpligtelser. Git vil "samle" alle forpligtelser i de sidste n forpligtelser, og hvis der var en fletning et sted imellem dette interval, vil du også se alle forpligtelserne, så resultatet bliver n +. Godt tip: Hvis du skal gøre det i mere end en enkelt gren, og du muligvis står over for konflikter, når du ændrer indholdet, skal du konfigurere git rerere og lade Git automatisk løse disse konflikter for dig. Dokumentation git-commit (1) Manuel side git-rebase (1) Manuel side git-push (1) Manuel side | git commit --ændring -m "din nye besked" | Hvis den forpligtelse, du vil rette, ikke er den seneste: git rebase - interaktiv $ parent_of_flawed_commit Hvis du vil rette flere mangelfulde forpligtelser, skal du videresende forældren til den ældste af dem. En redaktør kommer op med en liste over alle forpligtelser siden den, du gav. Skift valg for at omformulere (eller på gamle versioner af Git, for at redigere) foran de forpligtelser, du vil rette. Når du har gemt, afspiller Git de angivne forpligtelser igen. For hver forpligtelse, du vil omformulere, vil Git slippe dig tilbage til din editor. For hver forpligtelse, du vil redigere, slipper Git dig i skallen. Hvis du er i skallen: Skift forpligtelsen på den måde, du vil. git commit --ændre git rebase - fortsæt Det meste af denne sekvens vil blive forklaret for dig ved output fra de forskellige kommandoer, mens du går. Det er meget let; du behøver ikke at huske det - husk bare, at git rebase - interaktiv giver dig mulighed for at rette forpligtelser, uanset hvor længe siden de var. Bemærk, at du ikke vil ændre forpligtelser, som du allerede har skubbet på. Eller måske gør du det, men i så fald bliver du nødt til at være meget omhyggelig med at kommunikere med alle, der måske har trukket dine forpligtelser og udført arbejde oven på dem. Hvordan kan jeg gendanne / resynkronisere, når nogen skubber en rebase eller en nulstilling til en offentliggjort gren? | For at ændre den tidligere forpligtelse skal du foretage de ønskede ændringer og gennemføre disse ændringer og derefter køre git commit --ændre Dette åbner en fil i din teksteditor, der repræsenterer din nye forpligtelsesmeddelelse. Det starter udfyldt med teksten fra din gamle forpligtelsesmeddelelse. Skift forpligtelsesmeddelelsen, som du vil, gem derefter filen, og afslut din editor for at afslutte. Kør for at ændre den foregående forpligtelse og beholde den samme logmeddelelse git commit --ændre -C HEAD For at rette det forrige tilsagn ved at fjerne det helt, skal du køre git reset - hårdt HOVED ^ Hvis du vil redigere mere end en forpligtelsesmeddelelse, skal du køre git rebase -i HEAD ~ commit_count (Udskift commit_count med antallet af forpligtelser, som du vil redigere.) Denne kommando starter din editor. Marker den første forpligtelse (den, du vil ændre) som "rediger" i stedet for "vælg", gem derefter og afslut din editor. Foretag den ændring, du vil begå, og kør derefter git commit --ændre git rebase - fortsæt Bemærk: Du kan også "Foretag den ønskede ændring" fra redaktøren åbnet af git commit --amend | Som alleredenævnt, git commit --amend er vejen til at overskrive den sidste commit. En note: hvis du også vil overskrive filerne, ville kommandoen være git commit -a --amend -m "My new commit message" | Du kan også bruge git filterfilial til det. git filter-branch -f --msg-filter "sed 's / errror / error /'" $ flawed_commit..HEAD Det er ikke så let som en trivial git-forpligtelse - ændre, men det er især nyttigt, hvis du allerede har nogle fletninger efter din fejlagtige forpligtelsesmeddelelse. Bemærk, at dette vil forsøge at omskrive enhver forpligtelse mellem HEAD og den mangelfulde commit, så du skal vælge din msg-filter-kommando meget klogt ;-) | Jeg foretrækker denne måde: git commit --amend -c Ellers vil der være en ny forpligtelse med et nyt forpligtelses-id. | Hvis du bruger Git GUI-værktøjet, er der en knap med navnet Amend last commit. Klik på den knap, så viser den dine sidste forpligtelsesfiler og besked. Bare rediger denne meddelelse, så kan du begå den med en ny meddelelsesmeddelelse. Eller brug denne kommando fra en konsol / terminal: git commit -a --amend -m "My new commit message" | Du kan bruge Git rebasing. Hvis du f.eks. Vil ændre tilbage for at begå bbc643cd, skal du køre $ git rebase bbc643cd ^ --interaktiv I standardeditoren skal du ændre 'vælg' til 'redigere' i den linje, hvis forpligtelse du vil ændre. Foretag dine ændringer, og iscenesæt dem med $ git tilføj Nu kan du bruge $ git commit --ændring for at ændre forpligtelsen og derefter $ git rebase - fortsæt for at vende tilbage til den forrige hovedforpligtelse. | Hvis du kun vil ændre din sidste forpligtelsesmeddelelse, skal du gøre: git commit --ændre Det vil slippe dig ind i din teksteditor og lade dig ændre den sidste meddelelse. Hvis du vil ændre de sidste tre forpligtelsesmeddelelser eller nogen af forpligtelsesmeddelelserne op til det punkt, skal du levere HEAD ~ 3 til kommandoen git rebase -i: git rebase -i HEAD ~ 3 | Hvis du er nødt til at ændre en gammel meddelelsesmeddelelse over flere grene (dvs., at forpligtelsen med den fejlagtige meddelelse findes i flere grene), kan du bruge: git filter-gren -f --msg-filter \ 'sed "s / / / g"' - --all Git opretter en midlertidig mappe til omskrivning og yderligere sikkerhedskopiering af gamle referencer i refs / original /. -f vil håndhæve udførelsen af operationen. Dette er nødvendigt, hvis den midlertidige mappe allerede er til stede, eller hvis der allerede er referencer gemt under refs / original. Hvis det ikke er tilfældet, kan du slippe dette flag. - adskiller filterfilialindstillinger fra revisionsindstillinger. - alle sørger for, at alle grene og tags omskrives. På grund af sikkerhedskopien af dine gamle referencer kan du nemt gå tilbage til staten, før du udfører kommandoen. Sig, du vil gendanne din mester og få adgang til den i grenen old_master: git checkout -b old_master refs / original / refs / heads / master | Brug git commit --ændre For at forstå det detaljeret er et fremragende indlæg 4. Omskrivning af Git History. Den taler også om hvornår man ikke skal bruge git commit --amend. | Hvis det er din sidste forpligtelse, skal du bare ændre forpligtelsen: git commit --amend -o -m "New commit message" (Brug af -o (--only) -flagget for at sikre, at du kun ændrer forpligtelsesmeddelelsen) Hvis det er en begravet begåelse, skal du bruge den fantastiske interaktive rebase: git rebase -i @ ~ 9 # Vis de sidste 9 forpligtelser i en teksteditor Find det ønskede engagement, skift valg til r (omformuler), og gem og luk filen. Færdig! Miniature Vim-tutorial (eller hvordan man rebaserer med kun 8 tastetryk 3jcwrEscZZ): Kør vimtutor, hvis du har tid hjkl svarer til bevægelsestaster ← ↓ ↑ → Alle kommandoer kan være forud for et "interval", f.eks. 3j bevæger sig ned tre linjer i for at gå ind i insert-tilstand - tekst, du skriver, vises i filen Esc eller Ctrlc for at afslutte insert-tilstand og vende tilbage til "normal" -tilstand u at fortryde Ctrlr for at gøre igen dd, dw, dl for at slette henholdsvis en linje, et ord eller et bogstav cc, cw, cl for at ændre henholdsvis en linje, et ord eller et bogstav (samme som ddi) yy, yw, yl for at kopiere ("yank") henholdsvis en linje, et ord eller et bogstav p eller P for at indsætte henholdsvis efter eller før den aktuelle position : wIndtast for at gemme (skrive) en fil : q! Gå ind for at afslutte uden at gemme : wqEnter eller ZZ for at gemme og afslutte Hvis du redigerer tekst meget, skal du skifte til Dvorak-tastaturlayoutet, lære at berøre-typen og lære Vim. Er det umagen værd? Ja. ProTip ™: Vær ikke bange for at eksperimentere med "farlige" kommandoer, der omskriver historik * - Git sletter ikke dine forpligtelser i 90 dage som standard; du kan finde dem i reflogen: $ git reset @ ~ 3 # Gå tre forpligtelser tilbage $ git reflog c4f708b HEAD @ {0}: reset: flytter til @ ~ 3 2c52489 HEAD @ {1}: commit: flere ændringer 4a5246d HEAD @ {2}: commit: foretag vigtige ændringer e8571e4 HEAD @ {3}: commit: foretag nogle ændringer ... tidligere forpligter ... $ git nulstil 2c52489 ... og du er tilbage, hvor du startede * Hold øje med muligheder som - hårdt og - tvang dog - de kan kassere data. * Omskriv ikke historik på nogen grene, du samarbejder om. | Ændre Du har et parmuligheder her. Du kan gøre git commit --ændre så længe det er din sidste forpligtelse. Interaktiv rebase Ellers, hvis det ikke er din sidste forpligtelse, kan du lave en interaktiv rebase, git rebase -i [branched_from] [hash før begå] Derefter føjer du simpelthen redigering til den begåelse inde i den interaktive rebase. Når det kommer op, skal du lave en git-forpligtelse - ændre og ændre meddelelsen om forpligtelse. Hvis du vil rulle tilbage inden det forpligtede punkt, kan du også bruge git reflog og bare slette det. Så gør du bare en git-forpligtelse igen. | Hvis du bruger Git GUI, kan du ændre den sidste forpligtelse, som ikke er skubbet med: Forpligt / ændr sidste forpligtelse | Jeg bruger Git GUI så meget som muligt, og det giver dig mulighed for at ændre den sidste forpligtelse: Git rebase -i origin / master er også et godt mantra, der altid vil give dig de forpligtelser, du har udført oven på master, og giver dig mulighed for at ændre, slette, omarrangere eller squash. Ingen grund til at få fat i den hash først. | Wow, så der er mange måder at gøre dette på. Endnu en anden måde at gøre dette på er at slette den sidste forpligtelse, men hold dens ændringer, så du ikke mister dit arbejde. Du kan derefter foretage en anden forpligtelse med den korrigerede besked. Dette ville se sådan ud: git reset - soft HEAD ~ 1 git commit -m 'Ny og korrigeret forpligtelsesmeddelelse' Jeg gør det altid, hvis jeg glemmer at tilføje en fil eller foretage en ændring. Husk at specificere --soft i stedet for --hard, ellers mister du den forpligtelse helt. | For alle, der leder efter en Windows / Mac GUI til at hjælpe med redigering af ældre meddelelser (dvs. ikke kun den seneste besked), vil jeg anbefale Sourcetree. Trinene, der skal følges, er under billedet. For forpligtelser, der endnu ikke er skubbet til en fjernbetjening: Sørg for, at du har begået eller gemt alle aktuelle ændringer (dvs. at der ikke er nogen filer, der er anført i fanen "Filstatus") - det fungerer ikke ellers. I fanen "Log / Historie" skal du højreklikke på posten med en tilstødende linje i grafen en under den eller de forpligtelser, du vil redigere, og vælge "Rebase børn af interaktivt ..." Vælg hele rækken for en meddelelsesmeddelelse, du vil ændre (klik på kolonnen "Besked"). Klik på knappen "Rediger besked". Rediger meddelelsen som ønsket i den dialogboks, der kommer op, og klik derefter på OK. Gentag trin 3-4, hvis der er andre forpligtelsesmeddelelser, der skal ændres. Klik på OK: Rebasing begynder. Hvis alt er i orden, slutter output "Afsluttet med succes". BEMÆRK: Jeg har undertiden set dette mislykkes med Kan ikke oprette 'project_path / .git / index.lock': Filen findes. når du prøver at ændre flere kommitteringsmeddelelser på samme tid. Ikke helt nøjagtigt, hvad problemet er, eller om det vil blive rettet i en fremtidig version af Sourcetree, men hvis dette sker, vil det anbefale at rebase dem en ad gangen (langsommere men virker mere pålidelig). ... Eller ... for forpligtelser, der allerede er skubbet: Følg trinene i dette svar, der ligner ovenstående, men kræver, at der køres en yderligere kommando fra kommandolinjen (git push origin -f) for at tvinge skubbe grenen. Jeg vil anbefale at læse det hele og anvende den nødvendige forsigtighed! | Hvis du bare vil redigere den seneste forpligtelse, skal du bruge: git commit --ændre eller git commit --amend -m 'one line message' Men hvis du vil redigere flere forpligtelser i træk, skal du bruge rebasing i stedet: git rebase -i Skriv en redigering / e eller en af de andre muligheder i en fil, som den ovenfor, og tryk på Gem og afslut. Nu er du ved det første forkerte begå. Foretag ændringer i filerne, så bliver de automatisk iscenesat for dig. Type git commit --ændre Gem og afslut det og skriv git rebase - fortsæt for at gå til næste valg, indtil du er færdig med alle dine valg. Bemærk, at disse ting ændrer alle dine SHA-hashes efter den pågældende forpligtelse. | Hvis du kun vil ændre din sidste besked, skal du bruge - kun flag eller dets genvej -o med commit --ændring: git commit --amend -o -m "New commit message" Dette sikrer, at du ikke ved et uheld forbedrer din forpligtelse med iscenesatte ting. Naturligvis er det bedst at have en ordentlig $ EDITOR-konfiguration. Derefter kan du lade -m-indstillingen være ude, og Git udfylder forudgående meddelelsen med den gamle. På denne måde kan det let redigeres. | Opdater din sidste forkerte forpligtelsesmeddelelse med den nye meddelelsesmeddelelse i en linje: git commit --amend -m "din nye forpligtelsesmeddelelse" Eller prøv Git reset som nedenfor: # Du kan nulstille dit hoved til n antal forpligtelser # IKKE en god idé til at ændre sidste meddelelse, # men du kan få en idé om at opdele forpligtelse i flere forpligtelser git reset - soft HEAD ^ # Det nulstiller din sidste forpligtelse. Din tur # kan begå det igen med en ny forpligtelsesmeddelelse. Brug af nulstilling til opdeling af forpligtelser i mindre forpligtelser git reset kan også hjælpe dig med at opdele en forpligtelse i flere forpligtelser: # Nulstil dit hoved. Jeg nulstiller til sidste forpligtelse: git reset - soft HEAD ^ # (Du kan nulstille flere forpligtelser ved at udføre HEAD ~ 2 (antal forpligtelser) # Nulstil nu dit hoved tilopdele det til flere forpligtelser git reset HEAD # Tilføj og forpligt dine filer separat for at foretage flere forpligtelser: f.eks git tilføj app / git commit -m "tilføj alle filer i app-biblioteket" git tilføj config / git commit -m "tilføj alle filer i konfigurationsmappen" Her har du med succes opdelt din sidste forpligtelse i to forpligtelser. | På dette spørgsmål er der mange svar, men ingen af dem forklarer super detaljeret, hvordan man ændrer ældre forpligtelsesbeskeder ved hjælp af Vim. Jeg sad fast med at prøve at gøre dette selv, så her skriver jeg detaljeret ned, hvordan jeg gjorde dette især for folk, der ikke har nogen erfaring i Vim! Jeg ville ændre mine fem seneste forpligtelser, som jeg allerede skubbede til serveren. Dette er ret 'farligt', for hvis en anden allerede har trukket sig fra dette, kan du ødelægge tingene ved at ændre forpligtelsesmeddelelserne. Men når du arbejder på din egen lille gren og er sikker på, at ingen trak den, kan du ændre den sådan: Lad os sige, at du vil ændre dine fem seneste forpligtelser, og så skriver du dette i terminalen: git rebase -i HEAD ~ 5 * Hvor 5 er antallet af forpligtelsesmeddelelser, du vil ændre (så hvis du vil ændre den 10. til sidste forpligtelse, skal du indtaste 10). Denne kommando bringer dig ind i Vim, hvor du kan 'redigere' din forpligtelseshistorik. Du ser dine sidste fem forpligtelser øverst på denne måde: vælg commit meddelelse I stedet for at vælge skal du omformulere. Du kan gøre dette i Vim ved at skrive i. Det får dig til at gå ind for at indsætte tilstand. (Du ser, at du er i indsættelsestilstand ved ordet INDSÆT nederst.) For de forpligtelser, du vil ændre, skal du indtaste omformulering i stedet for at vælge. Derefter skal du gemme og afslutte denne skærm. Du gør det ved først at gå ind i 'kommandotilstand' ved at trykke på Esc-knappen (du kan kontrollere, at du er i kommandotilstand, hvis ordet INDSÆT nederst er forsvundet). Derefter kan du skrive en kommando ved at skrive:. Kommandoen til at gemme og afslutte er wq. Så hvis du skriver: wq, er du på rette spor. Derefter vil Vim gå igennem hver kommitteringsmeddelelse, du vil omformulere, og her kan du faktisk ændre kommitteringsmeddelelserne. Du gør dette ved at gå i indsættelsestilstand, ændre kommandobeskeden, gå ind i kommandotilstand og gemme og afslutte. Gør dette fem gange, så er du væk fra Vim! Derefter, hvis du allerede har skubbet dine forkerte forpligtelser, skal du git push - force for at overskrive dem. Husk, at git push --force er en ganske farlig ting at gøre, så sørg for at ingen trak fra serveren, da du skubbede dit forkerte engagement! Nu har du ændret dine forpligtelsesmeddelelser! (Som du ser, er jeg ikke så erfaren i Vim, så hvis jeg brugte den forkerte 'lingo' til at forklare, hvad der sker, er du velkommen til at rette mig!) | Du kan bruge git-rebase-reword Det er designet til at redigere ethvert commit (ikke kun sidst) på samme måde som commit --amend $ git rebase-reword Det er opkaldt efter handlingen på rebase interaktiv for at ændre en commit: "reword". Se dette indlæg og mand-sektion interaktiv tilstand- Eksempler: $ git rebase-reword b68f560 $ git rebase-reword HEAD ^ | Jeg har tilføjet aliaserne reci og recm for at genindføre (ændre) det. Nu kan jeg gøre det med git recm eller git recm -m: $ vim ~ / .gitconfig [alias] ...... cm = begå reci = begå --ændring recm = begå --ændring ...... | Jeg indså, at jeg havde skubbet en forpligtelse med en skrivefejl i den. For at fortryde gjorde jeg følgende: git commit --ændre -m "T-1000, avanceret prototype" git push --force Advarsel: kraft ved at skubbe til dine ændringer overskriver den eksterne gren med din lokale. Sørg for, at du ikke overskriver noget, du vil beholde. Vær også forsigtig med at tvinge en ændret (omskrevet) forpligtelse til, hvis nogen anden deler filialen med dig, fordi de bliver nødt til at omskrive deres egen historie, hvis de har den gamle kopi af den forpligtelse, som du lige har omskrevet. | Jeg kan godt lide at bruge følgende: git-status git add - alt git commit -am "besked går her om ændringen" git pull git push | Hvis du ikke har skubbet koden til din eksterne filial (GitHub / Bitbucket), kan du ændre kommitteringsmeddelelsen på kommandolinjen som nedenfor. git commit --ændring -m "Din nye besked" Hvis du arbejder på en bestemt gren, skal du gøre dette: git commit --ændring -m "BRANCH-NAME: new message" Hvis du allerede har skubbet koden med den forkerte besked, og du skal være forsigtig, når du ændrer beskeden. Når du har ændret forpligtelsesmeddelelsen og forsøger at skubbe den igen, får du problemer. Følg disse trin for at gøre det glat. Læs hele mit svar, inden du gør det. git commit --ændring -m "BRANCH-NAME: din nye besked" git push -f origin BRANCH-NAME # Ikke en bedste praksis. Læs nedenfor hvorfor? Vigtig note: Når du bruger force push direkte, kan du ende med kodeproblemer, som andre udviklere arbejder på den samme gren. Så for at undgå disse konflikter skal du trække koden fra din gren, før du opretter styrkenskubbe: git commit --ændring -m "BRANCH-NAME: din nye besked" git pull origin BRANCH-NAME git push -f origin BRANCH-NAME Dette er den bedste praksis, når du ændrer forpligtelsesmeddelelsen, hvis den allerede var skubbet. | Er det ikke det svar, du leder efter? Gennemse andre spørgsmål, der er tagget git git-commit git-rewrite-history, eller stil dit eget spørgsmål.